home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / ctutor.exe / TEXT / CHAP04.TXT < prev    next >
Text File  |  1994-05-15  |  36KB  |  754 lines

  1.  
  2.  
  3.  
  4.                                                         Chapter 4
  5.                                     ASSIGNMENT & LOGICAL COMPARES
  6.  
  7. Throughout this chapter, references are given to various ranges 
  8. of variables.  This refers to the range of values that can be 
  9. stored in any given variable.  Your compiler may use a different 
  10. range for some of the variables since the ANSI standard does not 
  11. define specific limits for all data types.  Consult the 
  12. documentation for your compiler for the exact range for each of 
  13. the variable types.
  14.  
  15.  
  16. INTEGER ASSIGNMENT STATEMENTS
  17. -----------------------------------------------------------------
  18. Load the file named INTASIGN.C and display it    ================
  19. for an example of assignment statements.            INTASIGN.C
  20. Three variables are defined for use in the       ================
  21. program and the remainder of the program is 
  22. merely a series of illustrations of various kinds of assignment 
  23. statements.  All three variables are defined on one line and have 
  24. unknown values stored in them initially.
  25.  
  26. The first two lines of the assignment statements, lines 8 and 9, 
  27. assign numerical values to the variables named a and b, and the 
  28. next five lines illustrate the five basic arithmetic functions 
  29. and how to use them.  The fifth is the modulo operator and gives 
  30. the remainder if the two variables were divided.  It can only be 
  31. applied to int or char type variables.  The char type variable 
  32. will be defined in the description of the next example program.  
  33. Lines 15 and 16 illustrate how to combine some of the variables 
  34. in relatively complex math expressions.  All of the above 
  35. examples should require no comment except to say that none of 
  36. the equations are meant to be particularly useful except as 
  37. illustrations.
  38.  
  39. The expressions in lines 17 and 18 are perfectly acceptable as 
  40. given, but we will see later in this chapter that there is another 
  41. way to write these for more compact code.
  42.  
  43.  
  44. VERY STRANGE LOOKING CODE
  45. -----------------------------------------------------------------
  46. This leaves us with the last two lines which may appear to you as 
  47. being very strange.  The C compiler scans the assignment 
  48. statement from right to left, (which may seem a bit odd since we 
  49. do not read that way), resulting in a very useful construct, 
  50. namely the one given here.  The compiler finds the value 20, 
  51. assigns it to c, then continues to the left finding that the 
  52. latest result of a calculation should be assigned to b.  Thinking 
  53. that the latest calculation resulted in a 20, it assigns it to b 
  54. also, and continues the leftward scan assigning the value 20 to a 
  55. also.  This is a very useful construct when you are initializing 
  56.  
  57.                                                          Page 4-1
  58.  
  59.                       Chapter 4 - Assignment and Logical Compares
  60.  
  61. a group of variables.  The statement in line 21 illustrates that 
  62. it is possible to actually do some calculations to arrive at the 
  63. value which will be assigned to all three variables.  The values 
  64. of a, b, and c, prior to the beginning of the statement in line 
  65. 21 are used to calculate a value, which is then assigned to each 
  66. of the variables.
  67.  
  68. As an aid to understanding, line 22 is given which contains 
  69. parentheses to group the terms together in a meaningful way.  
  70. Lines 20 and 22 are identical statements since they lead to the 
  71. same result.
  72.  
  73. The program has no output, so compiling and executing this 
  74. program will be very uninteresting. Since you have already 
  75. learned how to display some integer results using the printf() 
  76. function, it would be to your advantage to add some output 
  77. statements to this program to see if the various statements do 
  78. what you think they should do.  You can add your own assignment 
  79. statements also to gain experience with them.
  80.  
  81.  
  82. DEFINITIONS FIRST THEN EXECUTABLE STATEMENTS
  83. -----------------------------------------------------------------
  84. This would be a good time for a preliminary definition of a rule 
  85. to be followed in C.  The variable definitions are always given 
  86. before any executable statements in any program block.  This is 
  87. why the variables are defined first in this program and in every 
  88. C program.  If you try to define a new variable after executing 
  89. some statements, your compiler will issue an error.  A program 
  90. block is any unit of one or more statements surrounded by braces.  
  91. More will be said about blocks later.
  92.  
  93.  
  94. ADDITIONAL DATA TYPES
  95. -----------------------------------------------------------------
  96. Loading and editing MORTYPES.C will illustrate   ================
  97. how some additional data types can be used.         MORTYPES.C
  98. Once again we have defined a few integer type    ================
  99. variables which you should be fairly familiar 
  100. with by now, but we have added two new types, the char, and the 
  101. float.  The char type of data is nearly the same as the integer 
  102. except that it can only be assigned numerical values between 
  103. -128 and 127 on most implementations of C, since it is stored 
  104. in only one byte of memory.  The char type of data is usually 
  105. used for ASCII data, more commonly known as text.  The text you 
  106. are reading was originally written on a computer with a word 
  107. processor that stored the words in the computer one character per 
  108. byte.  In contrast, the integer data type is stored in two bytes 
  109. of computer memory on nearly all microcomputers.
  110.  
  111. Keep in mind that, even though the char type variable was 
  112. designed to hold a representation of an ASCII character, it can 
  113. be used very effectively to store a very small value if desired.  
  114.  
  115.                                                          Page 4-2
  116.  
  117.                       Chapter 4 - Assignment and Logical Compares
  118.  
  119. Much more will be discussed on this topic in chapter 7 when we 
  120. discuss strings.
  121.  
  122.  
  123. DATA TYPE MIXING
  124. -----------------------------------------------------------------
  125. It would be profitable at this time to discuss the way C handles 
  126. the two types char and int.  Most operations in C that are 
  127. designed to operate with integer type variables will work equally 
  128. well with character type variables because they are a form of an 
  129. integer variable.  Those operations, when called on to use a char 
  130. type variable, will actually promote the char data into integer 
  131. data before using it.  For this reason, it is possible to mix 
  132. char and int type variables in nearly any way you desire.  The 
  133. compiler will not get confused, but you might.  It is good not 
  134. to rely on this too much, but to carefully use only the proper 
  135. types of data where they should be used.
  136.  
  137. The second new data type is the float type of data, commonly 
  138. called floating point data.  This is a data type which usually 
  139. has a very large range, a large number of significant digits, and 
  140. a large number of computer words are required to store it.  The 
  141. float data type has a decimal point associated with it and has an 
  142. allowable range of from 3.4E-38 to 3.4E+38 when using most C 
  143. compilers on microcomputers, and is composed of about 7 
  144. significant digits.  Four bytes of memory are required to store a 
  145. single float type variable.
  146.  
  147.  
  148. HOW TO USE THE NEW DATA TYPES
  149. -----------------------------------------------------------------
  150. The first three lines of the program assign values to all nine of 
  151. the defined variables so we can manipulate some of the data 
  152. between the different types.
  153.  
  154. Since, as mentioned above, a char data type is in reality an 
  155. integer data type, no special considerations need be taken to 
  156. promote a char to an int, and a char type data field can be 
  157. assigned to an int variable.  Most C compilers simply truncate 
  158. the most significant bits and use the 8 least significant bits.  
  159. An int type variable will translate correctly to a char type 
  160. variable if the value is within the range of -128 to 127.
  161.  
  162. Line 16 illustrates the simplicity of translating an int into a 
  163. float. Simply assign it the new value and the system will do the 
  164. proper conversion.  When converting from float to int however, 
  165. there is an added complication.  Since there may be a fractional 
  166. part of the floating point number, the system must decide what to 
  167. do with it.  By definition, it will truncate it and throw away 
  168. the fractional part.
  169.  
  170. This program produces no output, and we haven't covered a way to 
  171. print out char and float type variables, so you can't really get 
  172.  
  173.                                                          Page 4-3
  174.  
  175.                       Chapter 4 - Assignment and Logical Compares
  176.  
  177. in to this program and play with the results.  The next program 
  178. will cover these topics for you.
  179.  
  180. Be sure to compile and run this program after you are sure you 
  181. understand it completely.  Note that, once again, the compiler 
  182. may issue warnings about type conversions when compiling this 
  183. program.  They can be ignored because of the small values we are 
  184. using to illustrate the various type conversions.
  185.  
  186.  
  187. LOTS OF VARIABLE TYPES
  188. -----------------------------------------------------------------
  189. Load the file LOTTYPES.C and display it on       ================
  190. your screen.  This file contains nearly every       LOTTYPES.C
  191. standard simple data type available in the       ================
  192. programming language C.  There are other 
  193. types, but they are the compound types (ie - arrays and 
  194. structures) that we will cover in due time.
  195.  
  196. Observe the file.  First we define a simple int, followed by a 
  197. long int which has a range of -2147483648 to 2147483647 with most 
  198. C compilers, and requires four bytes of storage.  Next we have a 
  199. short int which has a range that is identical to that for the int 
  200. variable, namely -32768 to 32767 and requires two bytes of 
  201. storage.  The unsigned is next and is defined as the same size as 
  202. the int but with no sign.  The unsigned then will cover a range 
  203. of 0 to 65535.  It should be pointed out that when the long, 
  204. short, or unsigned is desired, the int is optional and is left 
  205. out by most experienced programmers.  We have already covered the 
  206. char and the float, which leaves only the double.
  207.  
  208. The double is a floating point number but covers a greater range 
  209. than the float and has more significant digits for more precise 
  210. calculations.  It also requires more memory to store a value than 
  211. the simple float.  The double in most C compilers covers a range 
  212. of 1.7E-308 to 1.7E+308, contains 15 significant digits, and uses 
  213. 8 bytes of memory to store a single value.
  214.  
  215. Note that other compounding of types can be done such as long 
  216. unsigned int, unsigned char, etc.  Check your documentation for a 
  217. complete list of variable types.
  218.  
  219. Another diversion is in order at this point.  Your compiler 
  220. probably has no provision for floating point math, only double 
  221. floating point math.  It will promote a float to a double before 
  222. doing calculations and therefore only one math library will be 
  223. needed.  Of course, this is transparent to you, so you don't need 
  224. to worry about it.  Because of this, you may think that it would 
  225. be best to simply define every floating point variable as double, 
  226. since they are promoted before use in any calculations, but that 
  227. may not be a good idea.  A float variable requires 4 bytes of 
  228. storage and a double requires 8 bytes of storage, so if you have 
  229. a large volume of floating point data to store, the double will 
  230.  
  231.                                                          Page 4-4
  232.  
  233.                       Chapter 4 - Assignment and Logical Compares
  234.  
  235. obviously require much more memory.  If you don't need the 
  236. additional range or significant digits, you should use the float 
  237. type rather than the double.
  238.  
  239. After defining the data types in the program under consideration, 
  240. a numerical value is assigned to each of the defined variables in 
  241. order to demonstrate the means of outputting each to the monitor.
  242.  
  243.  
  244. SOME LATE ADDITIONS
  245. -----------------------------------------------------------------
  246. As any programming language evolves, additional constructs are 
  247. added to fill some previously overlooked need.  Two new keywords 
  248. have been added to C with the release of the ANSI-C standard.  
  249. They are not illustrated in example programs, but they will be 
  250. discussed here.  The two new keywords are const and volatile and 
  251. are used to tell the compiler that variables of these types will 
  252. need special consideration.  A constant is declared with the 
  253. const keyword and declares a value that will never be changed by 
  254. either the program or the system itself.  If you inadvertently 
  255. try to modify an entity defined as a const, the compiler will 
  256. generate an error.  This is an indication to you that something 
  257. is wrong.  Declaring an entity as const allows the optimizer to 
  258. do a better job which could make your program run a little 
  259. faster.  Since constants can never have a value assigned to them 
  260. in the executable part of the program, they must always be 
  261. initialized.
  262.  
  263. If volatile is used, it declares a value that may be changed by 
  264. the program but it may also be changed by some outside influence 
  265. such as a clock update pulse incrementing the stored value.  This 
  266. prevents the optimizer from getting too ambitious and optimizing 
  267. away something that it thinks will never be changed.
  268.  
  269.  
  270. Examples of use in declaring constants of these two types are 
  271. given as;
  272.  
  273.        const int index1 = 2;
  274.        const index2 = 6;
  275.        const float big_value = 126.4;
  276.        volatile const int index3 = 12;
  277.        volatile int index4;
  278.  
  279.  
  280. THE CONVERSION CHARACTERS
  281. -----------------------------------------------------------------
  282. Following is a list of some of the conversion characters and the 
  283. way they are used in the printf() statement.  A complete list of 
  284. all of the conversion characters should be included with the 
  285. documentation for your compiler.
  286.  
  287.  
  288.  
  289.                                                          Page 4-5
  290.  
  291.                       Chapter 4 - Assignment and Logical Compares
  292.  
  293.      d     decimal notation
  294.      i     decimal notation (new ANSI standard extension)
  295.      o     octal notation
  296.      x     hexadecimal notation
  297.      u     unsigned notation
  298.      c     character notation
  299.      s     string notation
  300.      f     floating point notation
  301.  
  302. Each of these is used following a percent sign to indicate the 
  303. type of output conversion desired.  The following fields may be 
  304. added between those two characters.
  305.  
  306.      -     left justification in its field
  307.      (n)   a number specifying minimum field width
  308.      .     to separate n from m
  309.      (m)   significant fractional digits for a float
  310.      l     to indicate a long
  311.      
  312. These are all used in the examples which are included in the 
  313. program named LOTTYPES.C, with the exception of the string 
  314. notation which will be covered later in this tutorial.  Lines 31 
  315. through 33 illustrate how to set the field width to a desired 
  316. width, and lines 37 and 38 illustrate how to set the field width 
  317. under program control.  This is not part of the original 
  318. definition of C, but it is included in the ANSI standard and has 
  319. become part of the C language.  The field width for the float 
  320. type output in lines 41 through 45 should be self explanatory.  
  321. Compile and run this program to see what effect the various 
  322. fields have on the output.
  323.  
  324. You now have the ability to display any of the data fields in 
  325. the previous programs and it would be to your advantage to go 
  326. back and see if you can display some of the fields anyway you 
  327. desire.
  328.  
  329.  
  330. COMBINING THE VARIOUS TYPES
  331. -----------------------------------------------------------------
  332. Examine the file named COMBINE.C for examples     ===============
  333. of combining variables of the various types in       COMBINE.C
  334. a program.  Many times it is necessary to         ===============
  335. multiply an int type variable times a float 
  336. type variable and C allows this by giving a strict set of rules 
  337. it will follow in order to do such combinations.
  338.  
  339. Five variables of three different types are declared in lines 4 
  340. through 6, and three of them are initialized so we have some data 
  341. to work with.  Line 8 gives an example of adding an int variable 
  342. to a float variable and assigning the result to a char type 
  343. variable.  The cast is used to control the type addition and is 
  344. indicated by putting the desired type in front of the variable as 
  345. shown.  This forces each of the two variables to the character 
  346.  
  347.                                                          Page 4-6
  348.  
  349.                       Chapter 4 - Assignment and Logical Compares
  350.  
  351. type prior to doing the addition.  In some cases, when the cast 
  352. is used, the actual bit patterns must be modified internally in 
  353. order to do the type coercion.  Lines 9 through 11 perform the 
  354. same operation by using different kinds of type casting to 
  355. achieve the final result.
  356.  
  357. Lines 13 through 15 illustrate the use of the cast to multiply 
  358. two float variables.  In two of the cases the intermediate 
  359. results are cast to the int type, with the result being cast back 
  360. to the float type.  The observant student will notice that all 
  361. three lines will not necessarily produce the same result.
  362.  
  363. Be sure to compile and execute this program.
  364.  
  365.  
  366. LOGICAL COMPARES
  367. -----------------------------------------------------------------
  368. Load and view the file named COMPARES.C for      ================
  369. many examples of compare statements in C.  We       COMPARES.C
  370. begin by defining and initializing nine          ================
  371. variables to use in the following compare 
  372. statements.  This method of variable initialization is new to you 
  373. and can be used to initialize variables when they are defined.
  374.  
  375. The first group of compare statements represents the simplest 
  376. kinds of compares because they simply compare two variables.  
  377. Either variable could be replaced with a constant and still be a 
  378. valid compare, but two variables is the general case.  The first 
  379. compare checks to see if the value of x is equal to the value of 
  380. y and it uses the double equal sign for the comparison.  A single 
  381. equal sign could be used here but it would have a different 
  382. meaning as we will see shortly.  The second comparison checks to 
  383. see if the current value of x is greater than the current value 
  384. of z.  
  385.  
  386. The third compare introduces the not operator, the exclamation, 
  387. which can be used to invert the result of any logical compare.  
  388. The fourth checks for the value of b less than or equal to the 
  389. value of c, and the last checks for the value of r not equal to 
  390. the value of s.  As we learned in the last chapter, if the result 
  391. of the compare is true, the statement following the if clause 
  392. will be executed and the results are given in the comments.  
  393.  
  394. Note that "less than" and "greater than or equal to" are also 
  395. available, but are not illustrated here.
  396.  
  397. It would be well to mention the different format used for the if 
  398. statement in this example program.  A carriage return is not 
  399. required as a statement separator and by putting the conditional 
  400. clause on the same line as the if, it adds to the readability of 
  401. the overall program in this case.
  402.  
  403.  
  404.  
  405.                                                          Page 4-7
  406.  
  407.                       Chapter 4 - Assignment and Logical Compares
  408.  
  409. MORE COMPARES
  410. -----------------------------------------------------------------
  411. The compares in the second group are a bit more involved.  
  412. Starting with the first compare, we find a rather strange looking 
  413. set of conditions in the parentheses.  To understand this we must 
  414. understand just what a true or false is in the C language.  A 
  415. false is defined as a value of zero, and true is defined as any 
  416. non-zero value.  Any integer or character type of variable can be 
  417. used for the result of a true/false test, or the result can be an 
  418. implied integer or character.
  419.  
  420. Look at the first compare of the second group of compare 
  421. statements.  The conditional expression "r != s" will evaluate as 
  422. a true since the value of r was set to 0.0 in line 13, so the 
  423. result of the compare will be a non-zero value.  With most C 
  424. compilers, it would always be set to a 1, but you could get in 
  425. trouble if you wrote a program that depended on it being 1 in all 
  426. cases because the compiler writer is permitted to use any non-
  427. zero value.  Good programming practice would be to not use the 
  428. resulting 1 in any calculations.  Even though the two variables 
  429. that are compared are float variables, the logical result will be 
  430. of type int.  There is no explicit variable to which it will be 
  431. assigned so the result of the compare is an implied int.  Finally, 
  432. the resulting number, probably 1 in this case, is assigned to the 
  433. integer variable x.  If double equal signs were used, the phantom 
  434. value, namely 1, would be compared to the value of x, but since 
  435. the single equal sign is used, the value 1 is simply assigned to 
  436. the variable named x, as though the statement were not in 
  437. parentheses.  Finally, since the result of the assignment in the 
  438. parentheses was non-zero, the entire expression is evaluated as 
  439. true, and z is assigned the value of 1000.  Thus we accomplished 
  440. two things in this statement, we assigned x a new value, probably 
  441. 1, and we assigned z the value of 1000.  We covered a lot in this 
  442. statement so you may wish to review it before going on.  The 
  443. important things to remember are the values that define true and 
  444. false, and the fact that several things can be assigned in a 
  445. conditional statement.  The value assigned to the variable x was 
  446. probably a 1, but remember that the only requirement is that it 
  447. is nonzero. 
  448.  
  449. The example in line 20 should help clear up some of the above in 
  450. your mind.  In this example, x is assigned the value of y, and 
  451. since the result is 11, the condition is non-zero, which is true, 
  452. and the variable z is assigned 222.
  453.  
  454. The third example of the second group in line 21, compares the 
  455. value of x to zero.  If the result is true, meaning that if x is 
  456. not zero, then z is assigned the value of 333, which it will be.  
  457. The last example in this group illustrates the same concept, 
  458. since the result will be true if x is non-zero.  The compare to 
  459. zero in line 21 is not actually needed and the result of the 
  460. compare is true.  The third and fourth examples of this group are 
  461. therefore identical.
  462.  
  463.                                                          Page 4-8
  464.  
  465.                       Chapter 4 - Assignment and Logical Compares
  466.  
  467. ADDITIONAL COMPARE CONCEPTS
  468. -----------------------------------------------------------------
  469. The third group of compares will introduce some additional 
  470. concepts, namely the logical "and" and the logical "or" 
  471. operators.  We assign the value of 77 to the three integer 
  472. variables simply to get started again with some defined values.  
  473. The first compare of the third group contains the new control &&, 
  474. which is the logical "and" which results in a true if both sides 
  475. of the and are true.  The entire statement reads, if x equals y 
  476. and if x equals 77 then the result is true.  Since this is true, 
  477. the variable z is set equal to 33.
  478.  
  479. The next compare in this group introduces the || operator which 
  480. is the logical "or" operator which results in a true if either 
  481. side of the "or" is true.  The statement reads, if x is greater 
  482. than y or if z is greater than 12 then the result is true.  Since 
  483. z is greater than 12, it doesn't matter if x is greater than y or 
  484. not, because only one of the two conditions must be true for the 
  485. result to be true.  The result is true, so therefore z will be 
  486. assigned the value of 22.
  487.  
  488.  
  489. LOGICAL EVALUATION (SHORT CIRCUIT)
  490. -----------------------------------------------------------------
  491. When a compound expression is evaluated, the evaluation proceeds 
  492. from left to right and as soon as the result of the outcome is 
  493. assured, evaluation stops.  Therefore, in the case of an "and" 
  494. evaluation, when one of the terms evaluates to false, evaluation 
  495. is discontinued because additional true terms cannot make the 
  496. result ever become true.  In the case of an "or" evaluation, if 
  497. any of the terms is found to be true, evaluation stops because it 
  498. will be impossible for additional terms to cause the result to be 
  499. false.  In the case of additionally nested terms, the above rules 
  500. will be applied to each of the nested levels.  This is called 
  501. short-circuit evaluation since the remaining terms are not 
  502. evaluated.
  503.  
  504.  
  505. PRECEDENCE OF OPERATORS
  506. -----------------------------------------------------------------
  507. The question will come up concerning the precedence of operators.  
  508. Which operators are evaluated first and which last?  There are 
  509. many rules about this topic, but I would suggest that you don't 
  510. worry about it at this point.  Instead, use lots of parentheses 
  511. to group variables, constants, and operators in a way meaningful 
  512. to you.  Parentheses always have the highest precedence and will 
  513. remove any question of which operations will be done first in any 
  514. particular statement.
  515.  
  516. Going on to the next example in group three in line 29, we find 
  517. three simple variables used in the conditional part of the 
  518. compare.  Since all three are non-zero, all three are true, and 
  519. therefore the "and" of the three variables is true, leading to 
  520.  
  521.                                                          Page 4-9
  522.  
  523.                       Chapter 4 - Assignment and Logical Compares
  524.  
  525. the result being true, and z is assigned the value of 11.  Note 
  526. that since the variables, r, s, and t are float type variables, 
  527. they could not be used this way, but they could each be compared 
  528. to zero and the same type of expression could be used as that 
  529. used in line 29.
  530.  
  531. Continuing on to line 30 we find three assignment statements in 
  532. the compare part of the if statement.  If you understood the 
  533. above discussion, you should have no difficulty understanding 
  534. that the three variables are assigned their respective new 
  535. values, and the result of all three are non-zero, leading to a 
  536. resulting value of true. 
  537.  
  538.  
  539. THIS IS A TRICK, BE CAREFUL
  540. -----------------------------------------------------------------
  541. The last example of the third group contains a bit of a trick, 
  542. but since we have covered it above, it is nothing new to you.  
  543. Notice that the first part of the compare evaluates to false.  
  544. The remaining parts of the compare are not evaluated, because it 
  545. is a logical "and" so it will definitely be resolved as a false 
  546. because the first term is false.  If the program was dependent on 
  547. the value of y being set to 3 in the next part of the compare, it 
  548. will fail because evaluation will cease following the false found 
  549. in the first term.  Likewise, the variable named z will not be 
  550. set to 4, and the variable r will not be changed.  This is 
  551. because C uses short circuit evaluation as discussed earlier.
  552.  
  553.  
  554. POTENTIAL PROBLEM AREAS
  555. -----------------------------------------------------------------
  556. The last group of compares illustrate three possibilities for 
  557. getting into a bit of trouble.  All three have the common result 
  558. that the variable z will not get set to the desired value, but 
  559. for different reasons.  In line 37, the compare evaluates as true, 
  560. but the semicolon following the second parentheses terminates the 
  561. if clause, and the assignment statement involving z is always 
  562. executed as the next statement.  The if therefore has no effect 
  563. because of the misplaced semicolon.  This is actually a null 
  564. statement and is legal in C.
  565.  
  566. The statement in line 38 is much more straightforward because the 
  567. variable x will always be equal to itself, therefore the 
  568. inequality will never be true, and the entire statement will 
  569. never do a thing, but is wasted effort.  The statement in line 39 
  570. will always assign 0 to x and the compare will therefore always 
  571. be false, never executing the conditional part of the if 
  572. statement. 
  573.  
  574. The conditional statement is extremely important and must be 
  575. thoroughly understood to write efficient C programs.  If any part 
  576. of this discussion is unclear in your mind, restudy it until you 
  577. are confident that you understand it thoroughly before proceeding 
  578.  
  579.                                                         Page 4-10
  580.  
  581.                       Chapter 4 - Assignment and Logical Compares
  582.  
  583. onward.  Compile and run this program.  Add some printout to see 
  584. the results of some of the operations.
  585.  
  586.  
  587. THE CRYPTIC PART OF C
  588. -----------------------------------------------------------------
  589. There are three constructs used in C that make    ===============
  590. no sense at all when first encountered because       CRYPTIC.C
  591. they are not intuitive, but they greatly          ===============
  592. increase the efficiency of the compiled code 
  593. and are used extensively by experienced C programmers.  You should 
  594. therefore be exposed to them and learn to use them because they 
  595. will appear in most, if not all, of the programs you see in the 
  596. publications.  Load and examine the file named CRYPTIC.C for 
  597. examples of the three new constructs.  In this program, some 
  598. variables are defined and initialized in the same statements for 
  599. use later.  The statement in line 8 simply adds 1 to the value 
  600. of x, and should come as no surprise to you.  The next two 
  601. statements also add one to the value of x, but it is not 
  602. intuitive that this is what happens.  It is simply by definition 
  603. that this is true. Therefore, by definition of the C language, a 
  604. double plus sign either before or after a variable increments 
  605. that variable by 1.  Additionally, if the plus signs are before 
  606. the variable, the variable is incremented before it is used, and 
  607. if the plus signs are after the variable, the variable is used, 
  608. then incremented.  In line 11, the value of y is assigned to the 
  609. variable z, then y is incremented because the plus signs are 
  610. after the variable y.  In the last statement of the incrementing 
  611. group of example statements, line 12, the value of y is 
  612. incremented then its value is assigned to the variable z.  To use 
  613. the proper terminology, line 9 uses the postincrement operator 
  614. and line 10 uses the preincrement operator.
  615.  
  616. The next group of statements illustrate decrementing a variable 
  617. by one.  The definition works exactly the same way for 
  618. decrementing as it does for incrementing.  If the minus signs are 
  619. before the variable, the variable is decremented, then used, and 
  620. if the minus signs are after the variable, the variable is used, 
  621. then decremented.  The proper terminology is the postdecrement 
  622. operator and the predecrement operator.
  623.  
  624.  
  625. THE CRYPTIC ARITHMETIC OPERATOR
  626. -----------------------------------------------------------------
  627. Another useful but cryptic operator is the arithmetic operator.  
  628. This operator is used to modify any variable by some constant 
  629. value.  The statement in line 23 adds 12 to the value of the 
  630. variable a.  The statement in line 24 does the same, but once 
  631. again, it is not intuitive that they are the same.  Any of the 
  632. four basic functions of arithmetic, +, -, *, or /, can be handled 
  633. in this way, by putting the function desired in front of the 
  634. equal sign and eliminating the second reference to the variable 
  635. name.  It should be noted that the expression on the right side 
  636.  
  637.                                                         Page 4-11
  638.  
  639.                       Chapter 4 - Assignment and Logical Compares
  640.  
  641. of the arithmetic operator can be any valid expression, the 
  642. examples are kept simple for your introduction to this new 
  643. operator. 
  644.  
  645. Just like the incrementing and decrementing operators, the 
  646. arithmetic operator is used extensively by experienced C 
  647. programmers and it would pay you well to understand it 
  648. thoroughly.
  649.  
  650.  
  651. THE CONDITIONAL EXPRESSION
  652. -----------------------------------------------------------------
  653. The conditional expression is just as cryptic as the last two, 
  654. but once again it is very useful so it would pay you to 
  655. understand it.  It consists of three expressions within 
  656. parentheses separated by a question mark and a colon.  The 
  657. expression prior to the question mark is evaluated to determine 
  658. if it is true or false.  If it is true, the expression between 
  659. the question mark and the colon is evaluated, and if the compare 
  660. expression is not true, the expression following the colon is 
  661. evaluated.  The result of the evaluation is used for the 
  662. assignment as illustrated in line 30.  The final result is 
  663. identical to that of an if statement with an else clause.  This 
  664. is illustrated by the example in lines 32 through 35 of this 
  665. group of statements.  The conditional expression has the added 
  666. advantage of more compact code that will compile to fewer machine 
  667. instructions in the final program.
  668.  
  669. Lines 37 and 38 of this example program are given to illustrate a 
  670. very compact way to assign the greater of the two variables a or 
  671. b to c, and to assign the lessor of the same two variables to c.  
  672. Notice how efficient the code is in these two examples.
  673.  
  674.  
  675. TO BE CRYPTIC OR NOT TO BE CRYPTIC
  676. -----------------------------------------------------------------
  677. Several students of C have stated that they didn't like these 
  678. three cryptic constructs and that they would simply never use 
  679. them.  This will be fine if they never have to read anybody 
  680. else's program, or use any other programs within their own.  I 
  681. have found many functions that I wished to use within a program 
  682. but needed a small modification to use it, requiring me to 
  683. understand another person's code.  It would therefore be to your 
  684. advantage to learn these new constructs, and use them. They will 
  685. be used in the remainder of this tutorial, so you will be 
  686. constantly exposed to them.
  687.  
  688. This has been a long chapter but it contained important material 
  689. to get you started in using C.  In the next chapter, we will go 
  690. on to the building blocks of C, the functions.  At that point, 
  691. you will have enough of the basic materials to allow you to begin 
  692. writing meaningful programs.
  693.  
  694.  
  695.                                                         Page 4-12
  696.  
  697.                       Chapter 4 - Assignment and Logical Compares
  698.  
  699. STYLE ISSUES
  700. -----------------------------------------------------------------
  701. We have no specific issues of style in this chapter other than 
  702. some of the coding styles illustrated in the example programs.  
  703. Most of these programs are very nontypical of real C programs 
  704. because there is never a need to list all of the possible 
  705. compares in a real program, for example.  You can use the example 
  706. programs as a guide to good style even though they are not real 
  707. programs.
  708.  
  709.  
  710. WHAT IS AN l-value AND AN r-value?
  711. -----------------------------------------------------------------
  712. You will sometimes see a reference to an l-value or a r-value in 
  713. writings about C or in the documentation for your C compiler.  
  714. Every variable has a r-value which is defined as the actual value 
  715. stored in the variable, and it also has an l-value which is 
  716. defined as its address, or the name of the variable.  Therefore, 
  717. the variable depicted graphically in figure 4-1 has an l-value of 
  718. index, and the r-value of 137 since 137 is the value stored in 
  719. the variable at this time.
  720.  
  721. The definition for this variable would be given as follows;
  722.  
  723.      int index = 137;
  724.  
  725.  
  726. PROGRAMMING EXERCISES
  727. -----------------------------------------------------------------
  728. 1.  Write a program that will count from 1 to 12 and print the 
  729.     count, and its square, for each count.
  730.         1       1
  731.         2       4
  732.         3       9   etc.
  733.  
  734. 2.  Write a program that counts from 1 to 12 and prints the count 
  735.     and its inversion to 5 decimal places for each count. This 
  736.     will require a floating point number.
  737.         1       1.00000
  738.         2        .50000
  739.         3        .33333
  740.         4        .25000
  741.         etc.
  742.  
  743. 3.  Write a program that will count from 1 to 100 and print only 
  744.     those values between 32 and 39, one to a line.  Use the 
  745.     incrementing operator for this program.
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.                                                         Page 4-13
  754.